extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}

#include <string>
#include <iostream>

int convert(const char* input_filename, const char* output_filename) {
//    if (argc < 3) {
//        std::cerr << "Usage: " << argv[0] << " <input file> <output file>" << std::endl;
//        return 1;
//    }

//    const char* input_filename = inputFilename;
//    const char* output_filename = outputFilename;

    // 初始化FFmpeg库
//    av_register_all();

    // 打开输入文件
    AVFormatContext* input_format_context = nullptr;
    if (avformat_open_input(&input_format_context, input_filename, nullptr, nullptr) != 0) {
        std::cerr << "Could not open input file: " << input_filename << std::endl;
        return 1;
    }

    // 获取流信息
    if (avformat_find_stream_info(input_format_context, nullptr) < 0) {
        std::cerr << "Could not find stream information" << std::endl;
        return 1;
    }

    // 找到视频流
    int video_stream_index = -1;
    for (unsigned int i = 0; i < input_format_context->nb_streams; i++) {
        if (input_format_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            video_stream_index = i;
            break;
        }
    }

    if (video_stream_index == -1) {
        std::cerr << "Could not find video stream" << std::endl;
        return 1;
    }

    // 获取视频编解码器参数
    AVCodecParameters* codec_parameters = input_format_context->streams[video_stream_index]->codecpar;

    // 查找解码器
    const AVCodec* codec = avcodec_find_decoder(codec_parameters->codec_id);
    if (!codec) {
        std::cerr << "Unsupported codec" << std::endl;
        return 1;
    }

    // 创建解码器上下文
    AVCodecContext* codec_context = avcodec_alloc_context3(codec);
    avcodec_parameters_to_context(codec_context, codec_parameters);

    // 打开解码器
    if (avcodec_open2(codec_context, codec, nullptr) < 0) {
        std::cerr << "Could not open codec" << std::endl;
        return 1;
    }

    // 创建输出格式上下文
    AVFormatContext* output_format_context = nullptr;
    avformat_alloc_output_context2(&output_format_context, nullptr, nullptr, output_filename);
    if (!output_format_context) {
        std::cerr << "Could not create output context" << std::endl;
        return 1;
    }

    // 创建输出流
    AVStream* output_stream = avformat_new_stream(output_format_context, nullptr);
    if (!output_stream) {
        std::cerr << "Could not create output stream" << std::endl;
        return 1;
    }

    // 设置输出流的编解码器参数
    avcodec_parameters_copy(output_stream->codecpar, codec_parameters);
    output_stream->codecpar->codec_tag = 0;

    // 打开输出文件
    if (!(output_format_context->oformat->flags & AVFMT_NOFILE)) {
        if (avio_open(&output_format_context->pb, output_filename, AVIO_FLAG_WRITE) < 0) {
            std::cerr << "Could not open output file: " << output_filename << std::endl;
            return 1;
        }
    }

    // 写入文件头
    if (avformat_write_header(output_format_context, nullptr) < 0) {
        std::cerr << "Error occurred when opening output file" << std::endl;
        return 1;
    }

    // 读取帧并写入输出文件
    AVPacket packet;
    while (av_read_frame(input_format_context, &packet) >= 0) {
        if (packet.stream_index == video_stream_index) {
            packet.stream_index = output_stream->index;
            av_interleaved_write_frame(output_format_context, &packet);
        }
        av_packet_unref(&packet);
    }

    // 写入文件尾
    av_write_trailer(output_format_context);

    // 释放资源
    avcodec_free_context(&codec_context);
    avformat_close_input(&input_format_context);
    if (output_format_context && !(output_format_context->oformat->flags & AVFMT_NOFILE)) {
        avio_closep(&output_format_context->pb);
    }
    avformat_free_context(output_format_context);

    std::cout << "Video conversion completed successfully!" << std::endl;

    return 0;
}